﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;
using blacksoft.Constantes;

namespace blacksoft.Controllers
{
    public class TerminalController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();
        //Departamentos
        private string[] departamentos = {
                                             "Amazonas",
                                             "Ancash",
                                             "Apurímac",
                                             "Arequipa",
                                             "Ayacucho",
                                             "Cajamarca",
                                             "Cuzco",
                                             "Huancavelica",
                                             "Huánuco",
                                             "Ica",
                                             "Junín",
                                             "La Libertad",
                                             "Lambayeque",
                                             "Lima",
                                             "Loreto",
                                             "Madre de Dios",
                                             "Moquegua",
                                             "Pasco",
                                             "Piura",
                                             "Puno",
                                             "San Martin",
                                             "Tacna",
                                             "Tumbes",
                                             "Ucayali",
                                         };
        //Estados posibles
        private class Estado
        {
            public string valor { get; set; }
            public string nombre { get; set; }

            public Estado(string valor, string nombre)
            {
                this.valor = valor;
                this.nombre = nombre;
            }
        }
        private List<Estado> estados = new List<Estado> { new Estado("AC", "Activo"), new Estado("IN", "Inactivo") };
        private List<Estado> estados_full = new List<Estado> { new Estado("AC", "Activo"), new Estado("IN", "Inactivo"), new Estado("AN", "Anulado") };
        //Cadena para anulación
        private Estado est_anulado = new Estado("AN", "Anulado");

        // GET: /Terminal/
        public ActionResult Index(string search_nombre, string search_direccion, string search_departamento, string search_telefono, string search_email, string search_estado, string sort_order)
        {
            ActionResult result_seguridad = ValidarSeguridadGlobal();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            ViewBag.Global = global;

            var terminales = from t in db.Terminal
                             select t;

            string activo = estados[0].valor;

            //Nombre
            if (!String.IsNullOrEmpty(search_nombre))
            {
                terminales = terminales.Where(t => t.Nombre.Contains(search_nombre));
            }

            //Dirección
            if(!String.IsNullOrEmpty(search_direccion))
            {
                terminales = terminales.Where(t => t.Direccion.Contains(search_direccion));
            }

            //Departamento
            //Lista de departamentos existentes
            var dptos_lst = new List<string>();
            var dptos_qry = from t in db.Terminal
                            where t.Estado != est_anulado.valor
                            orderby t.Departamento
                            select t.Departamento;
            dptos_lst.AddRange(dptos_qry.Distinct());
            ViewBag.search_departamento = new SelectList(dptos_lst);

            if (!String.IsNullOrEmpty(search_departamento))
            {
                terminales =  terminales.Where(t => t.Departamento == search_departamento);
            }

            //Teléfono
            //Lista de teléfionos existentes
            var telfs_lst = new List<int?>();
            var telfs_qry = from t in db.Terminal
                            where t.Estado != est_anulado.valor
                            orderby t.Telefono
                            select t.Telefono;
            telfs_lst.AddRange(telfs_qry.Distinct());
            ViewBag.search_telefono = new SelectList(telfs_lst);

            if (!String.IsNullOrEmpty(search_telefono))
            {
                int telefono = int.Parse(search_telefono);
                terminales =  terminales.Where(t => t.Telefono == telefono);
            }

            //E-mail
            if (!String.IsNullOrEmpty(search_email))
            {
                terminales = terminales.Where(t => t.Email.Contains(search_email));
            }

            //Estado
            ViewBag.search_estado = new SelectList(estados_full, "valor", "nombre");
            ViewBag.EstadoAC = estados_full.Find(e => e.valor == "AC").nombre;
            ViewBag.EstadoIN = estados_full.Find(e => e.valor == "IN").nombre;
            ViewBag.EstadoAN = estados_full.Find(e => e.valor == "AN").nombre;

            if (!String.IsNullOrEmpty(search_estado))
            {
                terminales = terminales.Where(t => t.Estado == search_estado);
            }

            //No mostrar anulados
            if (search_estado != est_anulado.valor)
            {
                terminales = terminales.Where(t => t.Estado != est_anulado.valor);
            }

            return View(terminales);
        }

        // GET: /Terminal/Details/5
        public ActionResult Details(int? id)
        {
            ActionResult result_seguridad = ValidarSeguridadGlobal();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            ViewBag.Global = global;

            if (id == null)
            {
                return View("Error404");
            }
            try
            {
                Terminal terminal = db.Terminal.Find(id);
                if (terminal == null)
                {
                    return View("Error404");
                }

                try
                {
                    ViewBag.Estado = estados.Find(e => e.valor == terminal.Estado).nombre;
                }
                catch
                {
                    TempData["details_failure"] = "no se encontró el estado de la terminal";
                }

                return View(terminal);
            }
            catch
            {
                TempData["details_failure"] = "no se encontró la terminal";
                return RedirectToAction("Index");
            }
        }

        // GET: /Terminal/Create
        public ActionResult Create()
        {
            ActionResult result_seguridad = ValidarSeguridadGlobal();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            ViewBag.Global = global;

            ViewBag.Departamento = new SelectList(departamentos);
            ViewBag.Estado = new SelectList(estados, "valor", "nombre", estados[0].valor);

            return View();
        }

        // POST: /Terminal/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include="IDTerminal,Nombre,Descripcion,Direccion,Provincia,Departamento,Telefono,Anexo,Email,Estado")] Terminal terminal)
        {
            ActionResult result_seguridad = ValidarSeguridadGlobal();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            ViewBag.Global = global;

            if (ModelState.IsValid)
            {
                db.Terminal.Add(terminal);
                try
                {
                    db.SaveChanges();
                }
                catch
                {
                    TempData["create_failure"] = "la terminal no se pudo registrar";
                    return RedirectToAction("Index");
                }
                TempData["create_success"] = "la terminal se registró exitosamente";
                return RedirectToAction("Index");
            }

            ViewBag.Departamento = new SelectList(departamentos);
            ViewBag.Estado = new SelectList(estados, "valor", "nombre");

            return View(terminal);
        }

        // GET: /Terminal/Edit/5
        public ActionResult Edit(int? id)
        {
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            ViewBag.Global = global;

            if (id == null)
            {
                return View("Error404");
            }
            try
            {
                Terminal terminal = db.Terminal.Find(id);
                if (terminal == null)
                {
                    return View("Error404");
                }

                ViewBag.Departamento = new SelectList(departamentos, terminal.Departamento);
                ViewBag.Estado = new SelectList(estados, "valor", "nombre", terminal.Estado);

                return View(terminal);
            }
            catch
            {
                if (global)
                {
                    TempData["edit_failure"] = "no se encontró la terminal";
                    return RedirectToAction("Index");
                }
                else
                {
                    TempData["terminal_edit_failure"] = "no se encontró la terminal";
                    return RedirectToAction("Index", "ModuloAdmin");
                }
            }
        }

        // POST: /Terminal/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include="IDTerminal,Nombre,Descripcion,Direccion,Provincia,Departamento,Telefono,Anexo,Email,Estado")] Terminal terminal)
        {
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            ViewBag.Global = global;

            if (ModelState.IsValid)
            {
                db.Entry(terminal).State = EntityState.Modified;
                try
                {
                    db.SaveChanges();
                }
                catch
                {
                    if (global)
                    {
                        TempData["edit_failure"] = "la terminal no se pudo modificar";
                        return RedirectToAction("Index");
                    }
                    else
                    {
                        TempData["terminal_edit_failure"] = "la terminal no se pudo modificar";
                        return RedirectToAction("Index", "ModuloAdmin");
                    }
                }
                if (global)
                {
                    TempData["edit_success"] = "la terminal se modificó exitosamente";
                    return RedirectToAction("Index");
                }
                else
                {
                    TempData["terminal_edit_success"] = "la terminal se modificó exitosamente";
                    return RedirectToAction("Index", "ModuloAdmin");
                }
            }

            ViewBag.Departamento = new SelectList(departamentos, terminal.Departamento);
            ViewBag.Estado = new SelectList(estados, "valor", "nombre", terminal.Estado);

            return View(terminal);
        }

        // GET: /Terminal/Delete/5
        public ActionResult Delete(int? id)
        {
            ActionResult result_seguridad = ValidarSeguridadGlobal();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            ViewBag.Global = global;

            if (id == null)
            {
                return View("Error404");
            }
            try
            {
                Terminal terminal = db.Terminal.Find(id);
                if (terminal == null)
                {
                    return View("Error404");
                }
                try
                {
                    ViewBag.Estado = estados.Find(e => e.valor == terminal.Estado).nombre;
                }
                catch
                {
                    TempData["details_failure"] = "no se encontró el estado de la terminal";
                }
                return View(terminal);
            }
            catch
            {
                TempData["delete_failure"] = "no se encontró la terminal";
                return RedirectToAction("Index");
            }
        }

        // POST: /Terminal/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            ActionResult result_seguridad = ValidarSeguridadGlobal();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            ViewBag.Global = global;

            Terminal terminal = db.Terminal.Find(id);
            //db.Terminal.Remove(terminal);
            //db.SaveChanges();
            terminal.Estado = est_anulado.valor;
            db.Entry(terminal).State = EntityState.Modified;
            try
            {
                db.SaveChanges();
            }
            catch
            {
                TempData["delete_failure"] = "la terminal no se pudo eliminar";
                return RedirectToAction("Index");
            }
            TempData["delete_success"] = "la terminal se eliminó exitosamente";
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private ActionResult ValidarSeguridad()
        {

            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.ADMINISTRACION))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            return null;
        }

        private ActionResult ValidarSeguridadGlobal()
        {
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL) && !PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.ADMINISTRACION))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            else if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL) && PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.ADMINISTRACION))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "ModuloAdmin");
            }
            return null;
        }
    }
}
